#if !defined(ximera_graphics_icamera_hpp)
#define ximera_graphics_icamera_hpp

// -----------------------------------------------------------

#include <ximera/config.hpp>
#include <ximera/enum.hpp>
#include <ximera/graphics/attachable.hpp>
#include <ximera/common/sharedptr.hpp>

namespace ximera { namespace graphics
{
    XIMERA_ENUM(RenderMode)
        Solid,
        Wireframe,
        Points
    XIMERA_ENUM_END(RenderMode)

    class XIMERA_API ICamera : public Attachable
    {
    public:
        ICamera(String const& name = L"")
            : Attachable(name) {}

        virtual RenderMode renderMode() const = 0;
        virtual void renderMode(RenderMode mode) = 0;

        virtual math::Vector3 position() const = 0;
        virtual void position(math::Vector3 const& pos) = 0;

        virtual math::Quaternion orientation() const = 0;
        virtual void orientation(math::Quaternion const& quat) = 0;

        virtual math::Vector3 direction() const = 0;
        virtual void direction(math::Vector3 const& dir) = 0;

        virtual math::Vector3 up() const = 0;
        virtual math::Vector3 right() const = 0;

        virtual void lookAt(math::Vector3 const& point) = 0;

        virtual Real aspectRatio() const = 0;
        virtual void aspectRatio(Real ratio) = 0;

        virtual Real nearClipDistance() const = 0;
        virtual void nearClipDistance(Real distance) = 0;

        virtual Real farClipDistance() const = 0;
        virtual void farClipDistance(Real distance) = 0;

        virtual Real fov() const = 0;
        virtual void fov(Real fov) = 0;

        virtual void roll(Real angle) = 0;
        virtual void yaw(Real angle) = 0;
        virtual void pitch(Real angle) = 0;

        virtual void rotate(math::Vector3 const& angles) = 0;
    };

    typedef SharedPtr<ICamera> ICameraPtr;
}}

// -----------------------------------------------------------

#endif
